/*******************************************************************************
  * 文件：KeyHandler.c
  * 作者：lj
  * 版本：v1.0.0
  * 日期：2020-07-03
  * 说明：按键处理
*******************************************************************************/

/* 头文件 *********************************************************************/
#include "KeyHandler.h"
#include "KeyDispatch.h"
#include "KeyCheck.h"
#include "DisplayBoard.h"
#include "BuzCtrl.h"
#include "DevInfor.h"
#include "StateMachine.h"
#include "TimingCtrl.h"
#include "Hardware_IO.h"

/* 宏定义 *********************************************************************/
/* 类型定义 *******************************************************************/
/* 变量定义 *******************************************************************/
/* 函数声明 *******************************************************************/
/* 函数定义 *******************************************************************/

/*******************************************************************************
  * 函数名: Key_PressLeftTimingHandler
  * 功  能：左灶定时按键短按处理函数
  * 参  数：无
  * 返回值：无
  * 说  明：左灶定时运行时，短按定时间，调节定时时间
*******************************************************************************/
void Key_PressLeftTimingHandler(void)
{
    // 左灶定时是否在运行，且中、右没有在调节参数
    if(ON == Timing_CheckLeftTimingRun()
        && FALSE == Timing_CheckMidFlashTimerActive()
            && FALSE == Timing_CheckRightFlashTimerActive())
    {
        if(eDEV_LEFT_TIMING != StateMachine_GetCurState())
        {
            // 左灶定时不在前台，切换至前台
            StateMachine_Change(eDEV_LEFT_TIMING);            
        }
        else
        {
            // 左灶已在前台，检查时间是否在闪烁
            if(FALSE == Timing_CheckLeftFlashTimerActive())
            {
                // 时间不在闪烁，修改定时时间
                Timing_ChangeLeftTimingTime(Timing_GetLeftTimingTime());   
            }
            else
            {
                // 时间在闪烁，确定定时时间
                Timing_ComfirmLeftTimingTime();
            }
        }

        // 蜂鸣器响
	    BuzCtrl(eBUZ_VALID);
    }
}

/*******************************************************************************
  * 函数名: Key_PressMidTimingHandler
  * 功  能：中灶定时按键短按处理函数
  * 参  数：无
  * 返回值：无
  * 说  明：中灶定时运行时，短按中灶定时键，调节定时时间
*******************************************************************************/
void Key_PressMidTimingHandler(void)
{
    // 中灶定时是否在运行，且左、右没有在调节时间
    if(ON == Timing_CheckMidTimingRun()
        && FALSE == Timing_CheckLeftFlashTimerActive()
            && FALSE == Timing_CheckRightFlashTimerActive())
    {
        if(eDEV_MID_TIMING != StateMachine_GetCurState())
        {
            // 中灶定时不在前台，切换至前台
            StateMachine_Change(eDEV_MID_TIMING);            
        }
        else
        {
            // 中灶定时已在前台，检查是否在闪烁时间
            if(FALSE == Timing_CheckMidFlashTimerActive())
            {
                // 时间不闪烁，修改定时时间
                Timing_ChangeMidTimingTime(Timing_GetMidTimingTime()); 
            }
            else
            {
                // 时间在闪烁，确认定时时间
                Timing_ComfirmMidTimingTime();
            }
        }

        // 蜂鸣器响
	    BuzCtrl(eBUZ_VALID);
    }
}

/*******************************************************************************
  * 函数名: Key_PressRightTimingHandler
  * 功  能：右灶定时按键短按处理函数
  * 参  数：无
  * 返回值：无
  * 说  明：右灶定时运行时，短按右灶定时按键，调节定时参数
*******************************************************************************/
void Key_PressRightTimingHandler(void)
{
    // 检查右灶定时是否在运行
    if(ON == Timing_CheckRightTimingRun()
        && FALSE == Timing_CheckLeftFlashTimerActive()
            && FALSE == Timing_CheckMidFlashTimerActive())
    {
        // 右灶定时已开启
        if(eDEV_RIGHT_TIMING != StateMachine_GetCurState())
        {
            // 右灶定时没在前台，切换至前台
            StateMachine_Change(eDEV_RIGHT_TIMING);          
        }
        else
        {
            // 右灶定时已在前台，检查是否时间在闪烁
            if(FALSE == Timing_CheckRightFlashTimerActive())
            {
                // 时间不在闪烁，修改定时时间
                Timing_ChangeRightTimingTime(Timing_GetRightTimingTime());
            }
            else
            {
                // 时间在闪烁，确定定时时间
                Timing_ComfirmRightTimingTime();
            }
        }
 
        // 蜂鸣器响
	    BuzCtrl(eBUZ_VALID);
    }
}

/*******************************************************************************
  * 函数名: Key_Press2SLeftTimingHandler
  * 功  能：左灶定时按键长按2S处理函数
  * 参  数：无
  * 返回值：无
  * 说  明：左灶点火后，长按左灶定时按键两秒，启动左灶定时
*******************************************************************************/
void Key_Press2SLeftTimingHandler(void)
{
    // 检测左灶火是否打开或(在演示模式且旋钮开关闭合)，且左灶定时没有开启，且左、中、右没有在调节参数
    if((eFIRE_ON == Dev_GetLeftFireState() || (TRUE == Dev_CheckDemoModeFlag() && 0 == Hardware_LeftStoveKnobCheck()))
         && OFF == Timing_CheckLeftTimingRun()
            && FALSE == Timing_CheckLeftFlashTimerActive()
                && FALSE == Timing_CheckMidFlashTimerActive()
                    && FALSE == Timing_CheckRightFlashTimerActive())
    {
        // 启动左灶定时
        Timing_StartLeftTiming(0);
        // 蜂鸣器响
	    BuzCtrl(eBUZ_VALID);
    }
}

/*******************************************************************************
  * 函数名: Key_Press2SRightTimingHandler
  * 功  能：右灶定时按键长按2S处理函数
  * 参  数：无
  * 返回值：无
  * 说  明：右灶点火后，长按右灶定时两秒，启动右灶定时
*******************************************************************************/
void Key_Press2SRightTimingHandler(void)
{
	// 检测右灶火是否打开或在演示模式，且右灶定时没有运行，且左、中、右不在调节参数
    if((eFIRE_ON == Dev_GetRightFireState() || (TRUE == Dev_CheckDemoModeFlag() && 0 == Hardware_RightStoveKnobCheck()))
        && OFF == Timing_CheckRightTimingRun()
            && FALSE == Timing_CheckLeftFlashTimerActive()
                && FALSE == Timing_CheckMidFlashTimerActive()
                    && FALSE == Timing_CheckRightFlashTimerActive())
    {
        // 启动右灶定时
        Timing_StartRightTiming(0);
        // 蜂鸣器响
	    BuzCtrl(eBUZ_VALID);
    }
}

/*******************************************************************************
  * 函数名: Key_Press2SMidTimingHandler
  * 功  能：中灶定时按键长按2S处理函数
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Key_Press2SMidTimingHandler(void)
{
	// 检测中灶火是否打开或在演示模式，且中灶定时没有运行，且左、右没在调节参数 
    if((eFIRE_ON == Dev_GetMidFireState()|| (TRUE == Dev_CheckDemoModeFlag() && 0 == Hardware_MidStoveKnobCheck()))
        && OFF == Timing_CheckMidTimingRun()
            && FALSE == Timing_CheckLeftFlashTimerActive()
                && FALSE == Timing_CheckMidFlashTimerActive()
                    && FALSE == Timing_CheckRightFlashTimerActive())
    {
        // 启动中灶定时
        Timing_StartMidTiming(0);
        // 蜂鸣器响
	    BuzCtrl(eBUZ_VALID);
    }
}

/*******************************************************************************
  * 函数名:Key_Press3SLeftTimingHandler
  * 功  能：左灶定时按键长按3S处理函数
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Key_Press3SLeftTimingHandler(void)
{
    // 左灶定时是否运行中
    if(ON == Timing_CheckLeftTimingRun())
    {
        // 停止左灶定时，不关火
        Timing_StopLeftTiming();
        // 蜂鸣器响
	    BuzCtrl(eBUZ_VALID);
    }
}

/*******************************************************************************
  * 函数名:Key_Press3SMidTimingHandler
  * 功  能：中灶定时按键长按3S处理函数
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Key_Press3SMidTimingHandler(void)
{
    // 中灶定时是否运行中
    if(ON == Timing_CheckMidTimingRun())
    {
        // 停止中灶定时，不关火
        Timing_StopMidTiming();
        // 蜂鸣器响
	    BuzCtrl(eBUZ_VALID);
    }
}

/*******************************************************************************
  * 函数名:Key_Press3SRightTimingHandler
  * 功  能：右灶定时按键长按3S处理函数
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Key_Press3SRightTimingHandler(void)
{
    // 右灶定时是否运行中
    if(ON == Timing_CheckRightTimingRun())
    {
        // 停止右灶定时，不关火
        Timing_StopRightTiming();
        // 蜂鸣器响
	    BuzCtrl(eBUZ_VALID);
    }
}

/*******************************************************************************
  * 函数名: Key_PressAddHandler
  * 功  能：加键短按函数
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Key_PressAddHandler(void)
{
    Bool bBuzVaild = FALSE;
    
    if(eDEV_LEFT_TIMING == StateMachine_GetCurState())
    {
        bBuzVaild = Timing_AddSubKeyPressHook(eKEY_ADD_PRESS,eLEFT_TIMING);
    }
    else if(eDEV_MID_TIMING == StateMachine_GetCurState())
    {
        bBuzVaild = Timing_AddSubKeyPressHook(eKEY_ADD_PRESS,eMID_TIMING);
    }
    else if(eDEV_RIGHT_TIMING == StateMachine_GetCurState())
    {
        bBuzVaild = Timing_AddSubKeyPressHook(eKEY_ADD_PRESS,eRIGHT_TIMING);
    }

    // 蜂鸣器有效
    if(bBuzVaild)
    {
        // 蜂鸣器响
        BuzCtrl(eBUZ_VALID);
    }
}

/*******************************************************************************
  * 函数名: Key_ContinuePressAddHandler
  * 功  能：加键连按函数
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Key_ContinuePressAddHandler(void)
{
    Bool bBuzVaild = FALSE;

    if(eDEV_LEFT_TIMING == StateMachine_GetCurState())
    {
        bBuzVaild = Timing_AddSubKeyPressHook(eKEY_ADD_LONG_PRESS,eLEFT_TIMING);
    }
    else if(eDEV_MID_TIMING == StateMachine_GetCurState())
    {
        bBuzVaild = Timing_AddSubKeyPressHook(eKEY_ADD_LONG_PRESS,eMID_TIMING);
    }
    else if(eDEV_RIGHT_TIMING == StateMachine_GetCurState())
    {
        bBuzVaild = Timing_AddSubKeyPressHook(eKEY_ADD_LONG_PRESS,eRIGHT_TIMING);
    }

    // 蜂鸣器有效
    if(bBuzVaild)
    {
        // 蜂鸣器响
        BuzCtrl(eBUZ_VALID);
    }
}

/*******************************************************************************
  * 函数名: Key_PressSubHandler
  * 功  能：减键短按函数
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Key_PressSubHandler(void)
{
    Bool bBuzVaild = FALSE;

    if(eDEV_LEFT_TIMING == StateMachine_GetCurState())
    {
        bBuzVaild = Timing_AddSubKeyPressHook(eKEY_SUB_PRESS,eLEFT_TIMING);
    }
    else if(eDEV_MID_TIMING == StateMachine_GetCurState())
    {
        bBuzVaild = Timing_AddSubKeyPressHook(eKEY_SUB_PRESS,eMID_TIMING);
    }
    else if(eDEV_RIGHT_TIMING == StateMachine_GetCurState())
    {
        bBuzVaild = Timing_AddSubKeyPressHook(eKEY_SUB_PRESS,eRIGHT_TIMING);   
    }

    // 蜂鸣器有效
    if(bBuzVaild)
    {
        // 蜂鸣器响
        BuzCtrl(eBUZ_VALID);
    }
}

/*******************************************************************************
  * 函数名: Key_ContinuePressSubHandler
  * 功  能：减键连按函数
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Key_ContinuePressSubHandler(void)
{
    Bool bBuzVaild = FALSE;
    
    if(eDEV_LEFT_TIMING == StateMachine_GetCurState())
    {
        bBuzVaild = Timing_AddSubKeyPressHook(eKEY_SUB_LONG_PRESS,eLEFT_TIMING);
    }
    else if(eDEV_MID_TIMING == StateMachine_GetCurState())
    {
        bBuzVaild = Timing_AddSubKeyPressHook(eKEY_SUB_LONG_PRESS,eMID_TIMING);
    }
    else if(eDEV_RIGHT_TIMING == StateMachine_GetCurState())
    {
        bBuzVaild = Timing_AddSubKeyPressHook(eKEY_SUB_LONG_PRESS,eRIGHT_TIMING);
    }

    // 蜂鸣器有效
    if(bBuzVaild)
    {
        // 蜂鸣器响
        BuzCtrl(eBUZ_VALID);
    }
}

/*******************************************************************************
  * 函数名: Key_LongPress10SAnyHandler
  * 功  能：任意按键长按十秒回调函数
  * 参  数：无
  * 返回值：无
  * 说  明：未点火时，任意按键长按十秒，进入延时模式
*******************************************************************************/
void Key_LongPress10SAnyHandler(void)
{
    // 检测左中右是否点火
    if(eFIRE_OFF == Dev_GetLeftFireState()
         && eFIRE_OFF == Dev_GetRightFireState()
            && eFIRE_OFF == Dev_GetMidFireState()
              && FALSE == Dev_CheckDemoModeFlag())
    {
        // 进入Demo模式
        StateMachine_Change(eDEV_DEMO);
    }
}

/***************************** 文件结束 ***************************************/
